/**
 * 符号需要使用 Symbol()函数初始化。因为符号本身是原始类型，所以 typeof 操作符对符号返回symbol。
 */
let sym = Symbol();
console.log(typeof sym); // symbol

/**
 *  调用 Symbol()函数时，也可以传入一个字符串参数作为对符号的描述（description），
 * 将来可以通过这个字符串来调试代码。但是，这个字符串参数与符号定义或标识完全无关
 */
let genericSymbol = Symbol();
let otherGenericSymbol = Symbol();

let fooSymbol = Symbol('foo');
let otherFooSymbol = Symbol('foo');
console.log(genericSymbol === otherGenericSymbol); // false
console.log(fooSymbol === otherFooSymbol); // false
console.log(typeof fooSymbol); // symbol

/**
 * 符号没有字面量语法，这也是它们发挥作用的关键。
 * 按照规范，你只要创建 Symbol()实例并将其用作对象的新属性，
 * 就可以保证它不会覆盖已有的对象属性，无论是符号属性还是字符串属性。
 */
// let genericSymbol = Symbol();
console.log(genericSymbol); // Symbol()
// let fooSymbol = Symbol('foo');
console.log(fooSymbol); // Symbol(foo)

/**
 * Symbol()函数不能与 new 关键字一起作为构造函数使用。
 */
let myBoolean = new Boolean();
console.log(typeof myBoolean); // object

let myString = new String();
console.log(typeof myString); // object

let myNumber = new Number();
console.log(typeof myNumber); // object

// let mySymbol = new Symbol(); // TypeError: Symbol is not a constructor
// 如果你确实想使用符号包装对象，可以借用 Object()函数
let mySymbol1 = Symbol();
let myWrappedSymbol = Object(mySymbol1);

console.log(typeof myWrappedSymbol); // object
